#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/9/27 14:36
# @Author  : shwy
# @Site    : http://ishwy.me
# @File    : func.py
# @Software: PyCharm

'''
import math

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y + step * math.sin(angle)
    return  nx,ny

# 返回值是一个tuple,多个变量可以同事接受一个tuple,按位置赋值.
x,y = move(100, 100, 60, math.pi / 6)

print r
'''

'''
定义函数时，需要确定函数名和参数个数；

如果有必要，可以先对参数的数据类型做检查；

函数体内部可以用return随时返回函数结果；

函数执行完毕也没有return语句时，自动return None。

函数可以同时返回多个值，但其实就是一个tuple。
'''

# 默认参数,如果要跳过其中一个,不按照其本身顺序,在传参的时候,就要带上参数名,默认参数必须指向不变对象,如None
def enroll(name, gender, age=6, city='Beijing'):
    print 'name:', name
    print 'gender:', gender
    print 'age:', age
    print 'city:', city

# enroll(raw_input('name:'),raw_input('gender:'),city=raw_input('city:'));

# 关键字参数,
# 可变参数允许你传入0个或任意个参数，这些可变参数在函数调用时自动组装为一个tuple。
def people(name, age, **kw):
    print 'name:',name, 'age:',age, 'other:',kw

# people(raw_input('name: '),raw_input('age: '),dddd=raw_input('dddd: '),ffff=raw_input('ffff: '),gggg=raw_input('gggg: '))


# 参数组合
# 参数定义的顺序必须是：必选参数、默认参数、可变参数和关键字参数。
def func(a, b, c=0, *args, **kw):
    print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw


'''
Python的函数具有非常灵活的参数形态，既可以实现简单的调用，又可以传入非常复杂的参数。

默认参数一定要用不可变对象，如果是可变对象，运行会有逻辑错误！

要注意定义可变参数和关键字参数的语法：

*args是可变参数，args接收的是一个tuple；

**kw是关键字参数，kw接收的是一个dict。

以及调用函数时如何传入可变参数和关键字参数的语法：

可变参数既可以直接传入：func(1, 2, 3)，又可以先组装list或tuple，再通过*args传入：func(*(1, 2, 3))；

关键字参数既可以直接传入：func(a=1, b=2)，又可以先组装dict，再通过**kw传入：func(**{'a': 1, 'b': 2})。

使用*args和**kw是Python的习惯写法，当然也可以用其他参数名，但最好使用习惯用法。
'''



print help('modules')